#pragma once
#include <sw/redis++/redis.h>
#include <iostream>
namespace zzy_mims
{
    class RedisClientFactory 
    {
    public:
        static std::shared_ptr<sw::redis::Redis> create
        (const std::string& host,const int port,const int db,bool keep_alive)
        {
            sw::redis::ConnectionOptions  opts;
            opts.host=host;//服务器IP地址
            opts.port= port;//服务器端口号
            opts.db = db;//Redis库的编号，默认就是0号
            opts.keep_alive =keep_alive;//是否进行长连接保活
            auto ret = std::make_shared<sw::redis::Redis>(opts);
            return ret;
        }
    };
    class Session
    {
    public:
        using ptr = std::shared_ptr<Session>;
        Session(const std::shared_ptr<sw::redis::Redis>& redis_client)
        :_redis_client(redis_client){};
        void append(const std::string& sid,const std::string& uid)
        {
            _redis_client->set(sid,uid);
        }
        void remove(const std::string& sid)
        {
            _redis_client->del(sid);
        }
        sw::redis::OptionalString uid(const std::string& sid)
        {
            return _redis_client->get(sid);
        }
    private:
        std::shared_ptr<sw::redis::Redis> _redis_client;
    };
    class Status
    {
    public:
        using ptr = std::shared_ptr<Status>;
        Status(const std::shared_ptr<sw::redis::Redis>& redis_client)
        :_redis_client(redis_client){};
        void append(const std::string& uid)
        {
            _redis_client->set(uid,"");
        }
        void remove(const std::string& uid)
        {
            _redis_client->del(uid);
        }
        bool exist(const std::string& uid)
        {
            return (bool)(_redis_client->get(uid));
        }
    private:
        std::shared_ptr<sw::redis::Redis> _redis_client;
    };
    class Code
    {
    public:
        using ptr = std::shared_ptr<Code>;
        Code(const std::shared_ptr<sw::redis::Redis>& redis_client)
        :_redis_client(redis_client){};

        void append(const std::string& cid,const std::string& code,
        const std::chrono::seconds &t = std::chrono::seconds(600))
        {
            _redis_client->set(cid,code,t);
        }
        void remove(const std::string& cid)
        {
            _redis_client->del(cid);
        }
        sw::redis::OptionalString code(const std::string& cid)
        {
            return _redis_client->get(cid);
        }
    private:
        std::shared_ptr<sw::redis::Redis> _redis_client;
    };
}